# 导入itertools库中的accumulate函数，用于计算数组的累加和
from itertools import accumulate
# 定义深度优先搜索函数，参数分别代表当前瓜的索引、当前累计重量以及已切瓜数量
def dfs(index, weight, cnt):
    global ans  # 全局变量ans用于记录最小切割次数
    # 如果已切瓜数量大于等于已知最少切割次数，则直接返回
    if cnt >= ans:
        return
    # 当前累计重量等于目标重量时，更新答案为较小的切割次数
    if weight == m:
        ans = min(ans, cnt)
    # 达到瓜列表末尾或者当前累计重量超过目标重量，或者即使购买下一个瓜也无法到达目标重量，结束本次递归
    if index == n or weight >= m or weight + nex[index] < m:
        return

    # 探索三种可能情况：买整个瓜、买半个瓜、不买当前瓜
    dfs(index + 1, weight + a[index], cnt)  # 买整个瓜
    dfs(index + 1, weight + a[index] // 2, cnt + 1)  # 买半个瓜（只有当瓜的重量为偶数时才可行）
    dfs(index + 1, weight, cnt)  # 不买当前瓜

# 输入部分：获取瓜的数量n、目标重量m以及每个瓜的具体重量a
n, m = map(int, input().split())
a = list(map(int, input().split()))
# 对瓜的重量进行排序并翻倍，以便后续操作
a.sort()
m <<= 1  # 目标重量翻倍，位运算效率更高
a = [x << 1 for x in a]
# 计算瓜重量的累加和，并将结果存储在nex中
nex = list(accumulate(a))
# 反转瓜重量列表和累加和列表，便于从大到小遍历瓜的重量
a = a[::-1]
# 反转后，nex[index] 表示从当前瓜（a[index]）到最后一个瓜的总重量
nex = nex[::-1]
# 初始化答案为最坏情况下的切割次数
ans = float('inf')
# 从第一个瓜开始进行深度优先搜索
dfs(0, 0, 0)
# 输出结果：如果找不到满足条件的方案，则输出-1，否则输出实际最小切割次数
print(-1 if ans == float('inf') else ans)
